home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / doom / server_1.zip / _SRVMODS.PAT < prev    next >
Text File  |  1996-10-04  |  43KB  |  1,341 lines

  1. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/ai.qc qc/ai.qc
  2. --- qc-ori/ai.qc    Thu Sep 26 11:15:38 1996
  3. +++ qc/ai.qc    Fri Oct  4 00:00:00 1996
  4. @@ -578,25 +578,25 @@
  5.  
  6.  //=============================================================================
  7.  
  8. -float()    WizardCheckAttack;
  9. -float()    DogCheckAttack;
  10. +//#jp#(Omit) float()    WizardCheckAttack;
  11. +//#jp#(Omit) float()    DogCheckAttack;
  12.  
  13.  float() CheckAnyAttack =
  14.  {
  15.      if (!enemy_vis)
  16.          return;
  17. -    if (self.classname == "monster_army")
  18. -        return SoldierCheckAttack ();
  19. -    if (self.classname == "monster_ogre")
  20. -        return OgreCheckAttack ();
  21. -    if (self.classname == "monster_shambler")
  22. -        return ShamCheckAttack ();
  23. -    if (self.classname == "monster_demon1")
  24. -        return DemonCheckAttack ();
  25. -    if (self.classname == "monster_dog")
  26. -        return DogCheckAttack ();
  27. -    if (self.classname == "monster_wizard")
  28. -        return WizardCheckAttack ();
  29. +//#jp#(Omit)    if (self.classname == "monster_army")
  30. +//#jp#(Omit)        return SoldierCheckAttack ();
  31. +//#jp#(Omit)    if (self.classname == "monster_ogre")
  32. +//#jp#(Omit)        return OgreCheckAttack ();
  33. +//#jp#(Omit)    if (self.classname == "monster_shambler")
  34. +//#jp#(Omit)        return ShamCheckAttack ();
  35. +//#jp#(Omit)    if (self.classname == "monster_demon1")
  36. +//#jp#(Omit)        return DemonCheckAttack ();
  37. +//#jp#(Omit)    if (self.classname == "monster_dog")
  38. +//#jp#(Omit)        return DogCheckAttack ();
  39. +//#jp#(Omit)    if (self.classname == "monster_wizard")
  40. +//#jp#(Omit)        return WizardCheckAttack ();
  41.      return CheckAttack ();
  42.  };
  43.  
  44. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/buttons.qc qc/buttons.qc
  45. --- qc-ori/buttons.qc    Thu Sep 26 11:15:38 1996
  46. +++ qc/buttons.qc    Fri Oct  4 00:00:00 1996
  47. @@ -55,6 +55,7 @@
  48.  {
  49.      if (other.classname != "player")
  50.          return;
  51. +    if (other.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  52.      self.enemy = other;
  53.      button_fire ();
  54.  };
  55. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/client.qc qc/client.qc
  56. --- qc-ori/client.qc    Sun Sep 29 23:29:00 1996
  57. +++ qc/client.qc    Fri Oct  4 00:00:00 1996
  58. @@ -59,6 +59,7 @@
  59.      parm7 = self.ammo_cells;
  60.      parm8 = self.weapon;
  61.      parm9 = self.armortype * 100;
  62. +        parm16 = self.player_status; //#jp#(PlayerStatus)
  63.  };
  64.  
  65.  void() SetNewParms =
  66. @@ -72,15 +73,20 @@
  67.      parm7 = 0;
  68.      parm8 = 1;
  69.      parm9 = 0;
  70. +    parm16 = 0; //#jp#(PlayerStatus)
  71.  };
  72.  
  73.  void() DecodeLevelParms =
  74.  {
  75. +  self.player_status = parm16;            //#jp#(PlayerStatus)
  76. +  SkinRestoreSkinFromStatusFlag(self);        //#jp#(Skin)
  77. +  if (!USE_MODULE_OBSERVER) {            //#jp#(Observer)
  78.      if (serverflags)
  79.      {
  80.          if (world.model == "maps/start.bsp")
  81.              SetNewParms ();        // take away all stuff on starting new episode
  82.      }
  83. +  }                        //#jp#(Observer)
  84.      
  85.      self.items = parm1;
  86.      self.health = parm2;
  87. @@ -149,6 +155,7 @@
  88.  // skip any text in deathmatch
  89.      if (deathmatch)
  90.      {
  91. +        LevelSelectSelectLevel(); //#jp#(LevelSelect)
  92.          GotoNextMap ();
  93.          return;
  94.      }
  95. @@ -294,6 +301,11 @@
  96.      if (other.classname != "player")
  97.          return;
  98.  
  99. +  if (ExitRulesExitingIsNotAllowed(other)) {    //#jp#(ExitRules)
  100. +    T_Damage (other, world, other, 50000);    //#jp#(ExitRules)
  101. +    return;                    //#jp#(ExitRules)
  102. +  }                        //#jp#(ExitRules)
  103. +
  104.      if ((cvar("noexit") == 1) || ((cvar("noexit") == 2) && (mapname != "start")))
  105.      {
  106.          T_Damage (other, self, self, 50000);
  107. @@ -353,7 +365,9 @@
  108.      if (coop)
  109.      {
  110.          // make a copy of the dead body for appearances sake
  111. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  112.          CopyToBodyQue (self);
  113. +   }//#jp#(Observer)
  114.          // get the spawn parms as they were at level start
  115.          setspawnparms (self);
  116.          // respawn        
  117. @@ -362,15 +376,24 @@
  118.      else if (deathmatch)
  119.      {
  120.          // make a copy of the dead body for appearances sake
  121. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  122.          CopyToBodyQue (self);
  123. +   }//#jp#(Observer)
  124.          // set default spawn parms
  125.          SetNewParms ();
  126. +        parm16 = self.player_status; //#jp#(PlayerStatus)
  127.          // respawn        
  128.          PutClientInServer ();
  129.      }
  130.      else
  131.      {    // restart the entire server
  132. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  133.          localcmd ("restart\n");
  134. +   } else {                //#jp#(Observer)
  135. +      SetNewParms();            //#jp#(Observer)
  136. +      parm16 = self.player_status;    //#jp#(Observer)//#jp#(PlayerStatus)
  137. +      PutClientInServer ();        //#jp#(Observer)
  138. +   }                    //#jp#(Observer)
  139.      }
  140.  };
  141.  
  142. @@ -389,6 +412,12 @@
  143.      set_suicide_frame ();
  144.      self.modelindex = modelindex_player;
  145.      self.frags = self.frags - 2;    // extra penalty
  146. +        RankCountEvent(self,RANK_SUICIDE);        //#jp#(Rank)
  147. +    ServerConsoleClientSuicide(self);               //#jp#(ServerConsole)
  148. +        if (KickSuicider(self)) return;            //#jp#(KickSuicider)
  149. +        if (self.player_status & PLAYER_IS_OBSERVER) {    //#jp#(Observer)
  150. +           self.observer_status = OBSERVER_BECOME_OBSERVER;//#jp#(Observer)
  151. +        }                        //#jp#(Observer)
  152.      respawn ();
  153.  };
  154.  
  155. @@ -498,6 +527,14 @@
  156.      self.invincible_finished = 0;
  157.      self.effects = 0;
  158.      self.invincible_time = 0;
  159. +        self.burn_burning = 0;        //#jp#(Burn)
  160. +        self.modules_weapon = 0;    //#jp#(Modules)
  161. +        self.modules_killweapon = 0;    //#jp#(Modules)
  162. +        self.drone_1 = world;        //#jp#(Drone)
  163. +        self.drone_2 = world;        //#jp#(Drone)
  164. +        self.drone_4 = world;        //#jp#(Drone)
  165. +        self.drone_8 = world;        //#jp#(Drone)
  166. +        self.drone_count = 0;        //#jp#(Drone)
  167.  
  168.      DecodeLevelParms ();
  169.      
  170. @@ -524,6 +561,32 @@
  171.      setmodel (self, "progs/player.mdl");
  172.      modelindex_player = self.modelindex;
  173.  
  174. +if (!self.kick_suicider_lasttime)                //#jp#(KickSuicider)
  175. +  self.kick_suicider_lasttime = time - 100000;            //#jp#(KickSuicider)
  176. +if (!self.player_status) {                    //#jp#(PlayerStatus)
  177. +  PlayerStatusSetFlag(self,PLAYER_IS_CLIENT);            //#jp#(PlayerStatus)
  178. +  if (USE_MODULE_OBSERVER) {                    //#jp#(Observer)
  179. +    self.observer_status = OBSERVER_BECOME_OBSERVER;        //#jp#(Observer)
  180. +  }                                //#jp#(Observer)
  181. +}                                //#jp#(PlayerStatus)
  182. +if (self.player_status & PLAYER_IS_OBSERVER) {            //#jp#(Observer)
  183. +  // happens after level change                    //#jp#(Observer)
  184. +  if (!(self.items & IT_AXE)) {                    //#jp#(Observer)
  185. +    // stay observer after level change                //#jp#(Observer)
  186. +    self.observer_status = OBSERVER_BECOME_OBSERVER;        //#jp#(Observer)
  187. +  }                                //#jp#(Observer)
  188. +}                                //#jp#(Observer)
  189. +if (!(self.observer_status & OBSERVER_BECOME_OBSERVER)) {    //#jp#(Observer)
  190. +  self.protect_finished = time + 6;                //#jp#(Protect)
  191. +  self.effects = self.effects | EF_BRIGHTFIELD;            //#jp#(Protect)
  192. +}                                //#jp#(Observer)
  193. +if (self.observer_status & OBSERVER_BECOME_OBSERVER) {        //#jp#(Observer)
  194. +   //becoming observer                        //#jp#(Observer)
  195. +   ObserverBecomeObserver(self);                //#jp#(Observer)
  196. +   PlayerStatusSetFlag(self,PLAYER_IS_OBSERVER);        //#jp#(Observer)
  197. +   return;                            //#jp#(Observer)
  198. +}                                //#jp#(Observer)
  199. +
  200.      setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
  201.      
  202.      self.view_ofs = '0 0 22';
  203. @@ -713,6 +776,8 @@
  204.          return;
  205.      }
  206.  
  207. +   if (ObserverDeathThink()) return;    //#jp#(Observer)
  208. +
  209.  // wait for any button down
  210.      if (!self.button2 && !self.button1 && !self.button0)
  211.          return;
  212. @@ -788,10 +853,12 @@
  213.  
  214.      if (self.waterlevel != 3)
  215.      {
  216. +if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  217.          if (self.air_finished < time)
  218.              sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM);
  219.          else if (self.air_finished < time + 9)
  220.              sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM);
  221. +}//#jp#(Observer)
  222.          self.air_finished = time + 12;
  223.          self.dmg = 2;
  224.      }
  225. @@ -924,6 +991,53 @@
  226.          return;
  227.      }
  228.      
  229. +        if (time > vote_checktime) {                    //#jp#(Vote)
  230. +           VoteThink();                            //#jp#(Vote)
  231. +        }                                //#jp#(Vote)
  232. +        if (!(self.player_status & PLAYER_PASSED_INIT_PHASE)) {        //#jp#(PlayerStatus)
  233. +           if (!(self.player_status & PLAYER_IS_INITIALIZED)) {        //#jp#(PlayerStatus)
  234. +              ModulesInitModules(self);                    //#jp#(Modules)
  235. +              if (USE_MODULE_OBSERVER) {                //#jp#(Observer)
  236. +                 sound (self, CHAN_BODY, "wizard/wsight.wav", 1, ATTN_NONE);//#jp#(Observer)
  237. +              }                                //#jp#(Observer)
  238. +              self.player_status_init_time = time;            //#jp#(PlayerStatus)
  239. +              PlayerStatusSetFlag(self,PLAYER_IS_INITIALIZED);        //#jp#(PlayerStatus)
  240. +           }                                //#jp#(PlayerStatus)
  241. +           if (!(self.player_status & PLAYER_DID_INIT_CALLS)) {        //#jp#(Init)
  242. +              if (time > self.player_status_init_time + 1) {        //#jp#(Init)
  243. +                 InitLetClientExecInit(self);                //#jp#(Init)
  244. +                 PlayerStatusSetFlag(self,PLAYER_DID_INIT_CALLS);    //#jp#(Init)
  245. +              }                                //#jp#(Init)
  246. +           }                                //#jp#(Init)
  247. +           if (!(self.player_status & PLAYER_PASSED_MOTD)) {        //#jp#(Motd)
  248. +              MotdThink();                        //#jp#(Motd)
  249. +           }                                //#jp#(Motd)
  250. +           if (time > self.player_status_init_time + 10) {        //#jp#(PlayerStatus)
  251. +              PlayerStatusSetFlag(self,PLAYER_PASSED_INIT_PHASE);    //#jp#(PlayerStatus)
  252. +           }                                //#jp#(PlayerStatus)
  253. +        }                                //#jp#(PlayerStatus)
  254. +        if (self.modules_level_inited != 2) {                //#jp#(Modules)
  255. +           if (!self.modules_level_inited) {                //#jp#(Modules)
  256. +              if (USE_MODULE_OBSERVER) {                //#jp#(Observer)
  257. +                 bprint (self.netname);                    //#jp#(Observer)
  258. +                 bprint (" entered the game\n");            //#jp#(Observer)
  259. +              }                                //#jp#(Observer)
  260. +              if (!exitrules_inited) { ExitRulesSetValues(); }        //#jp#(ExitRules)
  261. +              self.modules_level_entertime = time;            //#jp#(Modules)
  262. +              self.modules_level_inited = 1;                //#jp#(Modules)
  263. +           }                                //#jp#(Observer)
  264. +           if (time - self.modules_level_entertime > 2) {        //#jp#(Modules)
  265. +              if (self.player_status & PLAYER_PASSED_INIT_PHASE) {    //#jp#(PlayerStatus)
  266. +                 ModulesShowLevelInfo(self);                //#jp#(Modules)
  267. +                 self.modules_level_inited = 2;                //#jp#(Modules)
  268. +              }                                //#jp#(PlayerStatus)
  269. +           }                                //#jp#(Modules)
  270. +        }                                //#jp#(Modules)
  271. +        if (self.player_status & PLAYER_IS_OBSERVER) {            //#jp#(Observer)
  272. +           ObserverThink();                        //#jp#(Observer)
  273. +           return;                            //#jp#(Observer)
  274. +        }                                //#jp#(Observer)
  275. +
  276.      if (self.deadflag == DEAD_DYING)
  277.          return;    // dying, so do nothing
  278.  
  279. @@ -942,6 +1056,7 @@
  280.      {
  281.          self.weapon = W_BestWeapon ();
  282.          W_SetCurrentAmmo ();
  283. +        if (self.weapon==IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  284.      }
  285.  };
  286.      
  287. @@ -1098,6 +1213,12 @@
  288.          }
  289.      }    
  290.  
  291. +  if (self.protect_finished) {                //#jp#(Protect)
  292. +    if (self.protect_finished < time) {            //#jp#(Protect)
  293. +      self.protect_finished = 0;            //#jp#(Protect)
  294. +      self.effects = self.effects - (self.effects & EF_BRIGHTFIELD);//#jp#(Protect)
  295. +    }                            //#jp#(Protect)
  296. +  }                            //#jp#(Protect)
  297.  };
  298.  
  299.  
  300. @@ -1155,9 +1276,12 @@
  301.  */
  302.  void() ClientConnect =
  303.  {
  304. +if (!USE_MODULE_OBSERVER) {//#jp#(Observer)
  305.      bprint (self.netname);
  306.      bprint (" entered the game\n");
  307. +}//#jp#(Observer)
  308.      
  309. +        ServerConsolePlayerEntered(self); //#jp#(ServerConsole)
  310.  // a client connecting during an intermission can cause problems
  311.      if (intermission_running)
  312.          ExitIntermission ();
  313. @@ -1185,6 +1309,7 @@
  314.      bprint (" frags\n");
  315.      sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
  316.      set_suicide_frame ();
  317. +    PlayerStatusSetFlag(self,PLAYER_DISCONNECTED); //#jp#(PlayerStatus)
  318.  };
  319.  
  320.  /*
  321. @@ -1200,6 +1325,9 @@
  322.      local    string deathstring, deathstring2;
  323.      rnum = random();
  324.  
  325. +    RankClientObituary(targ,attacker); //#jp#(Rank)
  326. +    ServerConsoleClientObituary(targ,attacker); //#jp#(ServerConsole)
  327. +
  328.      if (targ.classname == "player")
  329.      {
  330.          if (attacker.classname == "teledeath")
  331. @@ -1229,13 +1357,36 @@
  332.              {
  333.                  // killed self
  334.                  attacker.frags = attacker.frags - 1;
  335. +if (targ.exitrules_death) {        //#jp#(ExitRules)
  336. +   if (USE_MODULE_EXITRULES) {        //#jp#(ExitRules)
  337. +      ExitRulesClientObituary(targ);    //#jp#(ExitRules)
  338. +      return;                //#jp#(ExitRules)
  339. +   }                    //#jp#(ExitRules)
  340. +}                    //#jp#(ExitRules)
  341.                  bprint (targ.netname);
  342.                  
  343. +if (targ.modules_killweapon == MODULES_WEAPON_SHRAPNEL) {//#jp#(Shrapnel)
  344. +   bprint (" didn't read the manual\n");        //#jp#(Shrapnel)
  345. +}                            //#jp#(Shrapnel)
  346. +else                            //#jp#(Shrapnel)
  347. +if (targ.modules_killweapon == MODULES_WEAPON_BURN) {    //#jp#(Burn)
  348. +   bprint (" plays with the fire\n");            //#jp#(Burn)
  349. +}                            //#jp#(Burn)
  350. +else                            //#jp#(Burn)
  351. +if (targ.modules_killweapon == MODULES_WEAPON_WELD) {    //#jp#(Weld)
  352. +   bprint (" couldn't wait to pull the trigger\n");    //#jp#(Weld)
  353. +}                            //#jp#(Weld)
  354. +else                            //#jp#(Weld)
  355. +if (targ.modules_killweapon == MODULES_WEAPON_DRONE) {    //#jp#(Drone)
  356. +   bprint (" gathers gooseberries\n");            //#jp#(Drone)
  357. +}                            //#jp#(Drone)
  358. +else                            //#jp#(Drone)
  359.                  if (targ.weapon == 64 && targ.waterlevel > 1)
  360.                  {
  361.                      bprint (" discharges into the water.\n");
  362.                      return;
  363.                  }
  364. +else                            //#jp#(Modules)
  365.                  if (targ.weapon == IT_GRENADE_LAUNCHER)
  366.                      bprint (" tries to put the pin back in\n");
  367.                  else
  368. @@ -1262,6 +1413,35 @@
  369.                  attacker.frags = attacker.frags + 1;
  370.  
  371.                  rnum = attacker.weapon;
  372. +if (attacker.frags> exitrules_maxfrags) exitrules_maxfrags = attacker.frags; //#jp#(ExitRules);
  373. +if (targ.modules_killweapon == MODULES_WEAPON_SHRAPNEL) {//#jp#(Shrapnel)
  374. +   deathstring = " was flamed by ";            //#jp#(Shrapnel)
  375. +   deathstring2 = "\n";                    //#jp#(Shrapnel)
  376. +   rnum = 0;                        //#jp#(Shrapnel)
  377. +}                            //#jp#(Shrapnel)
  378. +else                            //#jp#(Shrapnel)
  379. +if (targ.modules_killweapon == MODULES_WEAPON_BURN) {    //#jp#(Burn)
  380. +   deathstring = " was cremated by ";            //#jp#(Burn)
  381. +   deathstring2 = "\n";                    //#jp#(Burn)
  382. +   rnum = 0;                        //#jp#(Burn)
  383. +}                            //#jp#(Burn)
  384. +else                            //#jp#(Burn)
  385. +if (targ.modules_killweapon == MODULES_WEAPON_WELD) {    //#jp#(Weld)
  386. +   deathstring = " was torched by ";            //#jp#(Weld)
  387. +   deathstring2 = "\n";                    //#jp#(Weld)
  388. +   rnum = 0;                        //#jp#(Weld)
  389. +}                            //#jp#(Weld)
  390. +else                            //#jp#(Weld)
  391. +if (targ.modules_killweapon == MODULES_WEAPON_DRONE) {    //#jp#(Drone)
  392. +   deathstring = " plays with ";            //#jp#(Drone)
  393. +   deathstring2 = "'s balls\n";                //#jp#(Drone)
  394. +   if (targ.health < -40) {                //#jp#(Drone)
  395. +      deathstring = " erupted while rubbing ";        //#jp#(Drone)
  396. +      deathstring2 = "'s pickly toy\n";            //#jp#(Drone)
  397. +   }                            //#jp#(Drone)
  398. +   rnum = 0;                        //#jp#(Drone)
  399. +}                            //#jp#(Drone)
  400. +
  401.                  if (rnum == IT_AXE)
  402.                  {
  403.                      deathstring = " was ax-murdered by ";
  404. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/combat.qc qc/combat.qc
  405. --- qc-ori/combat.qc    Thu Sep 26 11:15:38 1996
  406. +++ qc/combat.qc    Fri Oct  4 00:00:00 1996
  407. @@ -57,6 +57,11 @@
  408.  {
  409.      local entity oself;
  410.  
  411. +   if (targ.classname == "drone") {    //#jp#(Drone)
  412. +    targ.think = DroneDie;        //#jp#(Drone)
  413. +    targ.nextthink = time;    //#jp#(Drone)
  414. +        return;                //#jp#(Drone)
  415. +   }                    //#jp#(Drone)
  416.      oself = self;
  417.      self = targ;
  418.      
  419. @@ -164,11 +169,42 @@
  420.      if ( (teamplay == 1) && (targ.team > 0)&&(targ.team == attacker.team) )
  421.          return;
  422.          
  423. +    if (targ.classname == "drone") {        //#jp#(Drone)
  424. +      if (inflictor.classname == "player") {    //#jp#(Drone)
  425. +        if (attacker.classname == "player") {    //#jp#(Drone)
  426. +          // drone attacked by shotgun        //#jp#(Drone)
  427. +          take = 100;                //#jp#(Drone)
  428. +        }                        //#jp#(Drone)
  429. +      }                        //#jp#(Drone)
  430. +    }                        //#jp#(Drone)
  431. +
  432. +  if (targ.protect_finished >=time) {            //#jp#(Protect)
  433. +    if (take < 1000) {                    //#jp#(Protect)
  434. +      if (time > targ.protect_sound_time + 2) {        //#jp#(Protect)
  435. +    sound (targ, CHAN_ITEM,protect_sound, 1, ATTN_NORM);//#jp#(Protect)
  436. +    targ.protect_sound_time = time;            //#jp#(Protect)
  437. +      }                            //#jp#(Protect)
  438. +      return;                        //#jp#(Protect)
  439. +    }                            //#jp#(Protect)
  440. +  }                            //#jp#(Protect)
  441. +
  442.  // do the damage
  443.      targ.health = targ.health - take;
  444.              
  445.      if (targ.health <= 0)
  446.      {
  447. +      if (inflictor.modules_weapon == MODULES_WEAPON_DRONE) {    //#jp#(Drone)
  448. +        targ.modules_killweapon = MODULES_WEAPON_DRONE;        //#jp#(Drone)
  449. +      }                                //#jp#(Drone)
  450. +      else if (inflictor.modules_weapon == MODULES_WEAPON_SHRAPNEL) {//#jp#(Shrapnel)
  451. +        targ.modules_killweapon = MODULES_WEAPON_SHRAPNEL;        //#jp#(Shrapnel)
  452. +      }                                //#jp#(Shrapnel)
  453. +      else if (inflictor.modules_weapon == MODULES_WEAPON_BURN) {    //#jp#(Burn)
  454. +        targ.modules_killweapon = MODULES_WEAPON_BURN;        //#jp#(Burn)
  455. +      }                                //#jp#(Burn)
  456. +      else if (inflictor.modules_weapon == MODULES_WEAPON_WELD) {    //#jp#(Weld)
  457. +        targ.modules_killweapon = MODULES_WEAPON_WELD;        //#jp#(Weld)
  458. +      }                                //#jp#(Weld)
  459.          Killed (targ, attacker);
  460.          return;
  461.      }
  462. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/fight.qc qc/fight.qc
  463. --- qc-ori/fight.qc    Thu Sep 26 11:15:38 1996
  464. +++ qc/fight.qc    Fri Oct  4 00:00:00 1996
  465. @@ -12,15 +12,15 @@
  466.  
  467.  void() knight_atk1;
  468.  void() knight_runatk1;
  469. -void() ogre_smash1;
  470. -void() ogre_swing1;
  471. +//#jp#(Omit) void() ogre_smash1;
  472. +//#jp#(Omit) void() ogre_swing1;
  473.  
  474. -void() sham_smash1;
  475. -void() sham_swingr1;
  476. -void() sham_swingl1;
  477. +//#jp#(Omit) void() sham_smash1;
  478. +//#jp#(Omit) void() sham_swingr1;
  479. +//#jp#(Omit) void() sham_swingl1;
  480.  
  481. -float()    DemonCheckAttack;
  482. -void(float side)    Demon_Melee;
  483. +//#jp#(Omit) float()    DemonCheckAttack;
  484. +//#jp#(Omit) void(float side)    Demon_Melee;
  485.  
  486.  void(vector dest) ChooseTurn;
  487.  
  488. Only in qc: files.dat
  489. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/items.qc qc/items.qc
  490. --- qc-ori/items.qc    Thu Oct  3 18:56:22 1996
  491. +++ qc/items.qc    Fri Oct  4 00:00:00 1996
  492. @@ -2,9 +2,9 @@
  493.  /* ALL LIGHTS SHOULD BE 0 1 0 IN COLOR ALL OTHER ITEMS SHOULD
  494.  BE .8 .3 .4 IN COLOR */
  495.  
  496. -
  497.  void() SUB_regen =
  498.  {
  499. +  if (USE_MODULE_RANDOM) { RandomSetOrigin(self); }   //#jp#(Random)
  500.      self.model = self.mdl;        // restore original model
  501.      self.solid = SOLID_TRIGGER;    // allow it to be touched again
  502.      sound (self, CHAN_VOICE, "items/itembk2.wav", 1, ATTN_NORM);    // play respawn sound
  503. @@ -52,6 +52,7 @@
  504.          remove(self);
  505.          return;
  506.      }
  507. +  if (USE_MODULE_RANDOM) { RandomInitItem(); }   //#jp#(Random)
  508.  };
  509.  
  510.  /*
  511. @@ -168,10 +169,12 @@
  512.              return;
  513.      }
  514.      
  515. +     if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_HEALTH) { //#jp#(Messages)
  516.      sprint(other, "You receive ");
  517.      s = ftos(self.healamount);
  518.      sprint(other, s);
  519.      sprint(other, " health\n");
  520. +     }                    //#jp#(Messages)
  521.      
  522.  // health touch sound
  523.      sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
  524. @@ -180,6 +183,7 @@
  525.      
  526.      self.model = string_null;
  527.      self.solid = SOLID_NOT;
  528. +    if (USE_MODULE_RANDOM) RandomUpdateItem(); //#jp#(Random)
  529.  
  530.      // Megahealth = rot down the player's super health
  531.      if (self.healtype == 2)
  532. @@ -274,11 +278,14 @@
  533.      if (deathmatch == 1)
  534.          self.nextthink = time + 20;
  535.      self.think = SUB_regen;
  536. +    if (USE_MODULE_RANDOM) RandomUpdateItem(); //#jp#(Random)
  537.  
  538. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_ARMOR) //#jp#(Messages)
  539.      sprint(other, "You got armor\n");
  540.  // armor touch sound
  541.      sound(other, CHAN_ITEM, "items/armor1.wav", 1, ATTN_NORM);
  542.      stuffcmd (other, "bf\n");
  543. +    other.protect_finished = time - 10; //#jp#(Protect)
  544.      
  545.      activator = other;
  546.      SUB_UseTargets();                // fire all targets / killtargets
  547. @@ -347,6 +354,15 @@
  548.  
  549.  float(float w) RankForWeapon =
  550.  {
  551. +  // fix bug occuring when picking up backpack //#jp#(Modules)
  552. +  if      (w & IT_LIGHTNING)        return 1;  //#jp#(Modules)
  553. +  else if (w & IT_ROCKET_LAUNCHER)  return 2;  //#jp#(Modules)
  554. +  else if (w & IT_SUPER_NAILGUN)    return 3;  //#jp#(Modules)
  555. +  else if (w & IT_GRENADE_LAUNCHER) return 4;  //#jp#(Modules)
  556. +  else if (w & IT_SUPER_SHOTGUN)    return 5;  //#jp#(Modules)
  557. +  else if (w & IT_NAILGUN)          return 6;  //#jp#(Modules)
  558. +  else                              return 7;  //#jp#(Modules)
  559. +
  560.      if (w == IT_LIGHTNING)
  561.          return 1;
  562.      if (w == IT_ROCKET_LAUNCHER)
  563. @@ -394,6 +410,7 @@
  564.      local    float    hadammo, best, new, old;
  565.      local    entity    stemp;
  566.      local    float    leave;
  567. +    local float weld_oldweapon; //#jp#(Weld)
  568.  
  569.      if (!(other.flags & FL_CLIENT))
  570.          return;
  571. @@ -460,9 +477,11 @@
  572.      else
  573.          objerror ("weapon_touch: unknown classname");
  574.  
  575. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_WEAPON) {//#jp#(Messages)
  576.      sprint (other, "You got the ");
  577.      sprint (other, self.netname);
  578.      sprint (other, "\n");
  579. +    }//#jp#(Messages)
  580.  // weapon touch sound
  581.      sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM);
  582.      stuffcmd (other, "bf\n");
  583. @@ -473,6 +492,8 @@
  584.      old = other.items;
  585.      other.items = other.items | new;
  586.      
  587. +    weld_oldweapon = other.weapon; //#jp#(Weld)
  588. +
  589.      stemp = self;
  590.      self = other;
  591.  
  592. @@ -483,6 +504,9 @@
  593.  
  594.      W_SetCurrentAmmo();
  595.  
  596. +    if (other.weapon==IT_NAILGUN && other.weapon != weld_oldweapon)  WeldToggleWeapon(other); //#jp#(Weld)
  597. +    self.protect_finished = time - 10; //#jp#(Protect)
  598. +
  599.      self = stemp;
  600.  
  601.      if (leave)
  602. @@ -494,6 +518,7 @@
  603.      if (deathmatch == 1)
  604.          self.nextthink = time + 30;
  605.      self.think = SUB_regen;
  606. +    if (USE_MODULE_RANDOM) RandomUpdateItem(); //#jp#(Random)
  607.      
  608.      activator = other;
  609.      SUB_UseTargets();                // fire all targets / killtargets
  610. @@ -645,9 +670,11 @@
  611.  
  612.      bound_other_ammo ();
  613.      
  614. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_AMMO) {//#jp#(Messages)
  615.      sprint (other, "You got the ");
  616.      sprint (other, self.netname);
  617.      sprint (other, "\n");
  618. +    }//#jp#(Messages)
  619.  // ammo touch sound
  620.      sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
  621.      stuffcmd (other, "bf\n");
  622. @@ -660,6 +687,7 @@
  623.          self = other;
  624.          self.weapon = W_BestWeapon();
  625.          W_SetCurrentAmmo ();
  626. +  if (self.weapon != best && self.weapon==IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  627.          self = stemp;
  628.      }
  629.  
  630. @@ -675,6 +703,7 @@
  631.      if (deathmatch == 1)
  632.          self.nextthink = time + 30;
  633.      self.think = SUB_regen;
  634. +    if (USE_MODULE_RANDOM) RandomUpdateItem(); //#jp#(Random)
  635.  
  636.      activator = other;
  637.      SUB_UseTargets();                // fire all targets / killtargets
  638. @@ -878,9 +907,11 @@
  639.      if (other.items & self.items)
  640.          return;
  641.  
  642. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_KEY) {//#jp#(Messages)
  643.      sprint (other, "You got the ");
  644.      sprint (other, self.netname);
  645.      sprint (other,"\n");
  646. +    }//#jp#(Messages)
  647.  
  648.      sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
  649.      stuffcmd (other, "bf\n");
  650. @@ -1085,9 +1116,13 @@
  651.      if (other.health <= 0)
  652.          return;
  653.  
  654. +  other.protect_finished = time - 10; //#jp#(Protect)
  655. +
  656. +  if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_POWERUP) {//#jp#(Messages)
  657.      sprint (other, "You got the ");
  658.      sprint (other, self.netname);
  659.      sprint (other,"\n");
  660. +  }//#jp#(Messages)
  661.  
  662.      if (deathmatch)
  663.      {
  664. @@ -1107,6 +1142,7 @@
  665.      self.solid = SOLID_NOT;
  666.      other.items = other.items | self.items;
  667.      self.model = string_null;
  668. +    if (USE_MODULE_RANDOM) RandomUpdateItem(); //#jp#(Random)
  669.  
  670.  // do the apropriate action
  671.      if (self.classname == "item_artifact_envirosuit")
  672. @@ -1232,6 +1268,7 @@
  673.      local    float    best, old, new;
  674.      local        entity    stemp;
  675.      local    float    acount;
  676. +     local float weld_oldweapon; //#jp#(Weld)
  677.      
  678.      if (other.classname != "player")
  679.          return;
  680. @@ -1239,6 +1276,7 @@
  681.          return;
  682.  
  683.      acount = 0;
  684. +  if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_BACKPACK) {//#jp#(Messages)
  685.      sprint (other, "You get ");
  686.  
  687.      if (self.items)
  688. @@ -1248,6 +1286,7 @@
  689.              sprint (other, "the ");
  690.              sprint (other, self.netname);
  691.          }
  692. +  }//#jp#(Messages)
  693.  
  694.  // if the player was using his best weapon, change up to the new one if better        
  695.      stemp = self;
  696. @@ -1260,6 +1299,7 @@
  697.      other.ammo_nails = other.ammo_nails + self.ammo_nails;
  698.      other.ammo_rockets = other.ammo_rockets + self.ammo_rockets;
  699.      other.ammo_cells = other.ammo_cells + self.ammo_cells;
  700. +    weld_oldweapon = other.weapon; //#jp#(Weld)
  701.  
  702.      new = self.items;
  703.      if (!new)
  704. @@ -1269,6 +1309,7 @@
  705.      
  706.      bound_other_ammo ();
  707.  
  708. +  if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_BACKPACK) {//#jp#(Messages)
  709.      if (self.ammo_shells)
  710.      {
  711.          if (acount)
  712. @@ -1307,6 +1348,8 @@
  713.      }
  714.      
  715.      sprint (other, "\n");
  716. +    }//#jp#(Messages)
  717. +
  718.  // backpack touch sound
  719.      sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
  720.      stuffcmd (other, "bf\n");
  721. @@ -1322,6 +1365,8 @@
  722.          Deathmatch_Weapon (old, new);
  723.  
  724.      W_SetCurrentAmmo ();
  725. +    if (other.weapon==IT_NAILGUN && other.weapon != weld_oldweapon)  WeldToggleWeapon(other); //#jp#(Weld)
  726. +    other.protect_finished = time - 10; //#jp#(Protect)
  727.  };
  728.  
  729.  /*
  730. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/player.qc qc/player.qc
  731. --- qc-ori/player.qc    Thu Sep 26 11:15:40 1996
  732. +++ qc/player.qc    Fri Oct  4 00:00:00 1996
  733. @@ -282,6 +282,11 @@
  734.          return;
  735.      }
  736.  
  737. +   if (self.burn_burning) {    //#jp#(Burn)
  738. +      BurnPainSound();        //#jp#(Burn)
  739. +      return;            //#jp#(Burn)
  740. +   }                //#jp#(Burn)
  741. +
  742.      if (self.pain_finished > time)
  743.      {
  744.          self.axhitme = 0;
  745. @@ -424,9 +429,15 @@
  746.      return;
  747.  };
  748.  
  749. +void() GibPlayer; //#jp#(Burn)
  750.  
  751.  void() PlayerDead =
  752.  {
  753. +  if (self.modules_killweapon == MODULES_WEAPON_BURN) { //#jp#(Burn)
  754. +    GibPlayer();                                        //#jp#(Burn)
  755. +    return;                                             //#jp#(Burn)
  756. +  }                                                     //#jp#(Burn)
  757. +
  758.      self.nextthink = -1;
  759.  // allow respawn after a certain time
  760.      self.deadflag = DEAD_DEAD;
  761. @@ -436,6 +447,13 @@
  762.  {
  763.      local vector v;
  764.  
  765. +  if (self.modules_killweapon == MODULES_WEAPON_BURN) {    //#jp#(Burn)
  766. +    v = self.velocity;                    //#jp#(Burn)
  767. +    v_x = v_x + crandom()*80;                //#jp#(Burn)
  768. +    v_y = v_y + crandom()*80;                //#jp#(Burn)
  769. +    v_z = v_z + 50 + random()*50;            //#jp#(Burn)
  770. +    return v;                        //#jp#(Burn)
  771. +  }                            //#jp#(Burn)
  772.      v_x = 100 * crandom();
  773.      v_y = 100 * crandom();
  774.      v_z = 200 + 100 * random();
  775. @@ -487,8 +505,10 @@
  776.      self.solid = SOLID_NOT;
  777.      self.view_ofs = '0 0 8';
  778.      setsize (self, '-16 -16 0', '16 16 56');
  779. + if (!(self.modules_killweapon == MODULES_WEAPON_BURN)) {    //#jp#(Burn)
  780.      self.velocity = VelocityForDamage (dm);
  781.      self.origin_z = self.origin_z - 24;
  782. + }                                //#jp#(Burn)
  783.      self.flags = self.flags - (self.flags & FL_ONGROUND);
  784.      self.avelocity = crandom() * '0 600 0';
  785.  };
  786. @@ -528,6 +548,8 @@
  787.      self.items = self.items - (self.items & IT_INVISIBILITY);
  788.      self.invisible_finished = 0;    // don't die as eyes
  789.      self.invincible_finished = 0;
  790. +    self.protect_finished = 0;                    //#jp#(Protect)
  791. +    self.effects = self.effects - (self.effects & EF_BRIGHTFIELD);    //#jp#(Protect)
  792.      self.super_damage_finished = 0;
  793.      self.radsuit_finished = 0;
  794.      self.modelindex = modelindex_player;    // don't use eyes
  795. @@ -554,6 +576,11 @@
  796.      
  797.      self.angles_x = 0;
  798.      self.angles_z = 0;
  799. +
  800. +  if (self.modules_killweapon == MODULES_WEAPON_BURN) { //#jp#(Burn)
  801. +    player_dieb1();                                     //#jp#(Burn)
  802. +    return;                                             //#jp#(Burn)
  803. +  }                                                     //#jp#(Burn)
  804.      
  805.      if (self.weapon == IT_AXE)
  806.      {
  807. Only in qc-ori: progs.dat
  808. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/progs.src qc/progs.src
  809. --- qc-ori/progs.src    Thu Sep 26 11:15:40 1996
  810. +++ qc/progs.src    Fri Oct  4 00:00:00 1996
  811. @@ -1,6 +1,29 @@
  812.  ../progs.dat
  813.  
  814.  defs.qc
  815. +
  816. +_modules.qh
  817. +_plystat.qh
  818. +_burn.qh
  819. +_drone.qh
  820. +_exitrls.qh
  821. +_init.qh
  822. +_kckscdr.qh
  823. +_levsel.qh
  824. +_lightng.qh
  825. +_message.qh
  826. +_motd.qh
  827. +_random.qh
  828. +_rank.qh
  829. +_skin.qh
  830. +_observe.qh
  831. +_protect.qh
  832. +_servhlp.qh
  833. +_servcon.qh
  834. +_shrap.qh
  835. +_vote.qh
  836. +_weldgun.qh
  837. +
  838.  subs.qc
  839.  fight.qc
  840.  ai.qc
  841. @@ -17,19 +40,43 @@
  842.  plats.qc
  843.  misc.qc
  844.  
  845. -ogre.qc
  846. -demon.qc
  847. -shambler.qc
  848. -knight.qc
  849. -soldier.qc
  850. -wizard.qc
  851. -dog.qc
  852. -zombie.qc
  853. -boss.qc
  854. -
  855. -tarbaby.qc        // registered
  856. -hknight.qc        // registered
  857. -fish.qc            // registered
  858. -shalrath.qc        // registered
  859. +//#jp#(Omit) ogre.qc
  860. +//#jp#(Omit) demon.qc
  861. +//#jp#(Omit) shambler.qc
  862. +//#jp#(Omit) knight.qc
  863. +//#jp#(Omit) soldier.qc
  864. +//#jp#(Omit) wizard.qc
  865. +//#jp#(Omit) dog.qc
  866. +//#jp#(Omit) zombie.qc
  867. +//#jp#(Omit) boss.qc
  868. +
  869. +//#jp#(Omit) tarbaby.qc        // registered
  870. +//#jp#(Omit) hknight.qc        // registered
  871. +//#jp#(Omit) fish.qc            // registered
  872. +//#jp#(Omit) shalrath.qc        // registered
  873.  enforcer.qc        // registered
  874. -oldone.qc        // registered
  875. +//#jp#(Omit) oldone.qc        // registered
  876. +
  877. +_plystat.qc
  878. +_burn.qc
  879. +_drone.qc
  880. +_exitrls.qc
  881. +_init.qc
  882. +_kckscdr.qc
  883. +_levsel.qc
  884. +_lightng.qc
  885. +_message.qc
  886. +_modules.qc
  887. +_motd.qc
  888. +_observe.qc
  889. +_protect.qc
  890. +_skin.qc
  891. +_random.qc
  892. +_rank.qc
  893. +_servcon.qc
  894. +_servhlp.qc
  895. +_shrap.qc
  896. +_vote.qc
  897. +_weldgun.qc
  898. +_omit.qc
  899. +
  900. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/weapons.qc qc/weapons.qc
  901. --- qc-ori/weapons.qc    Mon Sep 30 03:08:08 1996
  902. +++ qc/weapons.qc    Fri Oct  4 00:00:00 1996
  903. @@ -22,6 +22,45 @@
  904.      precache_sound ("weapons/grenade.wav");    // grenade launcher
  905.      precache_sound ("weapons/bounce.wav");        // grenade bounce
  906.      precache_sound ("weapons/shotgn2.wav");    // super shotgun
  907. +   if (USE_MODULE_SHRAPNEL) {                //#jp#(Shrapnel)
  908. +     shrapnel_launch_sound_1 = "weapons/sgun1.wav";    //#jp#(Shrapnel)
  909. +     shrapnel_launch_sound_2 = "knight/sword1.wav";    //#jp#(Shrapnel)
  910. +     shrapnel_explode_sound  = "weapons/sgun1.wav";    //#jp#(Shrapnel)
  911. +     //precache_sound (shrapnel_launch_sound_1);        //#jp#(Shrapnel)
  912. +     precache_sound (shrapnel_launch_sound_2);        //#jp#(Shrapnel)
  913. +     //precache_sound (shrapnel_explode_sound);        //#jp#(Shrapnel)
  914. +   }                            //#jp#(Shrapnel)
  915. +   if (USE_MODULE_DRONE) {                //#jp#(Drone)
  916. +     drone_launch_sound_1 = "shalrath/attack2.wav";    //#jp#(Drone)
  917. +     drone_launch_sound_2 = "knight/khurt.wav";        //#jp#(Drone)
  918. +     drone_hoover_sound   = "boss1/throw.wav";        //#jp#(Drone)
  919. +     precache_sound (drone_launch_sound_1);        //#jp#(Drone)
  920. +     precache_sound (drone_launch_sound_2);        //#jp#(Drone)
  921. +     precache_sound (drone_hoover_sound);        //#jp#(Drone)
  922. +   }                            //#jp#(Drone)
  923. +   if (USE_MODULE_WELDGUN) {                //#jp#(Weld)
  924. +     weld_fire_sound_1  = "weapons/spike2.wav";        //#jp#(Weld)
  925. +     weld_fire_sound_2  = "hknight/idle.wav";        //#jp#(Weld)
  926. +     weld_explode_sound = "wizard/hit.wav";        //#jp#(Weld)
  927. +     //precache_sound (weld_fire_sound_1);        //#jp#(Weld)
  928. +     precache_sound (weld_fire_sound_2);        //#jp#(Weld)
  929. +     precache_sound (weld_explode_sound);        //#jp#(Weld)
  930. +   }                            //#jp#(Weld)
  931. +   if (USE_MODULE_PROTECT) {                //#jp#(Protect)
  932. +     protect_sound  = "wizard/wdeath.wav";        //#jp#(Protect)
  933. +     precache_sound (protect_sound);            //#jp#(Protect)
  934. +   }                            //#jp#(Protect)
  935. +   if (USE_MODULE_BURN) {                //#jp#(Burn)
  936. +     burn_pain_sound_1     = "player/lburn1.wav";    //#jp#(Burn)
  937. +     burn_pain_sound_2     = "player/lburn2.wav";    //#jp#(Burn)
  938. +     burn_extinguish_sound = "player/slimbrn2.wav";    //#jp#(Burn)
  939. +     burn_light_sound      = "boss1/throw.wav";        //#jp#(Burn)
  940. +     //precache_sound (burn_pain_sound_1);        //#jp#(Burn)
  941. +     //precache_sound (burn_pain_sound_2);        //#jp#(Burn)
  942. +     //precache_sound (burn_extinguish_sound);        //#jp#(Burn)
  943. +     precache_sound (burn_light_sound);            //#jp#(Burn)
  944. +   }                            //#jp#(Burn)
  945. +
  946.  };
  947.  
  948.  float() crandom =
  949. @@ -62,6 +101,7 @@
  950.          WriteCoord (MSG_BROADCAST, org_y);
  951.          WriteCoord (MSG_BROADCAST, org_z);
  952.      }
  953. +    self.protect_finished = time - 10; //#jp#(Protect)
  954.  };
  955.  
  956.  
  957. @@ -268,6 +308,8 @@
  958.  
  959.      sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);    
  960.  
  961. +    self.protect_finished = time - 10; //#jp#(Protect)
  962. +
  963.      self.punchangle_x = -2;
  964.      
  965.      self.currentammo = self.ammo_shells = self.ammo_shells - 1;
  966. @@ -293,6 +335,8 @@
  967.          
  968.      sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM);    
  969.  
  970. +    self.protect_finished = time - 10; //#jp#(Protect)
  971. +
  972.      self.punchangle_x = -4;
  973.      
  974.      self.currentammo = self.ammo_shells = self.ammo_shells - 2;
  975. @@ -374,6 +418,12 @@
  976.  void() W_FireRocket =
  977.  {
  978.      local    entity missile, mpuff;
  979. +
  980. +    self.protect_finished = time - 10; //#jp#(Protect)
  981. +    if (self.modules_weapon & MODULES_WEAPON_SHRAPNEL) { //#jp#(Shrapnel)
  982. +      ShrapnelMissileFire();                             //#jp#(Shrapnel)
  983. +      return;                                            //#jp#(Shrapnel)
  984. +    }                                                    //#jp#(Shrapnel)
  985.      
  986.      self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  987.      
  988. @@ -471,9 +521,25 @@
  989.      {
  990.          self.weapon = W_BestWeapon ();
  991.          W_SetCurrentAmmo ();
  992. +        if (self.weapon==IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  993.          return;
  994.      }
  995.  
  996. +  self.protect_finished = time - 10; //#jp#(Protect)
  997. +  if (USE_MODULE_LIGHTNING) {                //#jp#(Lightning)
  998. +    if (self.waterlevel > 2) {                //#jp#(Lightning)
  999. +      if (USE_MODULE_LIGHTNING) {            //#jp#(Lightning)
  1000. +    local float ddd;                //#jp#(Lightning)
  1001. +    ddd = 20*self.ammo_cells;            //#jp#(Lightning)
  1002. +    if (ddd > 400) ddd = 400;            //#jp#(Lightning)
  1003. +    T_RadiusDamage (self, self, ddd, world);    //#jp#(Lightning)
  1004. +    self.ammo_cells = 0;                //#jp#(Lightning)
  1005. +    W_SetCurrentAmmo ();                //#jp#(Lightning)
  1006. +    return;                        //#jp#(Lightning)
  1007. +      }                            //#jp#(Lightning)
  1008. +    }                            //#jp#(Lightning)
  1009. +  }                            //#jp#(Lightning)
  1010. +  else {                        //#jp#(Lightning)
  1011.  // explode if under water
  1012.      if (self.waterlevel > 1)
  1013.      {
  1014. @@ -483,12 +549,15 @@
  1015.          T_RadiusDamage (self, self, 35*cells, world);
  1016.          return;
  1017.      }
  1018. +   }                            //#jp#(Lightning)
  1019.  
  1020. +   if (!USE_MODULE_LIGHTNING) {                //#jp#(Lightning)
  1021.      if (self.t_width < time)
  1022.      {
  1023.          sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
  1024.          self.t_width = time + 0.6;
  1025.      }
  1026. +   }                            //#jp#(Lightning)
  1027.      self.punchangle_x = -2;
  1028.  
  1029.      self.currentammo = self.ammo_cells = self.ammo_cells - 1;
  1030. @@ -497,6 +566,8 @@
  1031.      
  1032.      traceline (org, org + v_forward*600, TRUE, self);
  1033.  
  1034. +   if (USE_MODULE_LIGHTNING) LightningMakeNoise(self,trace_endpos);//#jp#(Lightning)
  1035. +
  1036.      WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  1037.      WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  1038.      WriteEntity (MSG_BROADCAST, self);
  1039. @@ -531,6 +602,8 @@
  1040.  {
  1041.      if (other == self.owner)
  1042.          return;        // don't explode on owner
  1043. +   if (other.classname == "drone") return; //#jp#(Drone)
  1044. +
  1045.      if (other.takedamage == DAMAGE_AIM)
  1046.      {
  1047.          GrenadeExplode();
  1048. @@ -549,6 +622,12 @@
  1049.  void() W_FireGrenade =
  1050.  {
  1051.      local    entity missile, mpuff;
  1052. +
  1053. +  self.protect_finished = time - 10; //#jp#(Protect)
  1054. +  if (self.modules_weapon & MODULES_WEAPON_DRONE) {    //#jp#(Drone)
  1055. +    DroneFire();                    //#jp#(Drone)
  1056. +    return;                        //#jp#(Drone)
  1057. +  }                            //#jp#(Drone)
  1058.      
  1059.      self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  1060.      
  1061. @@ -606,6 +685,11 @@
  1062.  */
  1063.  void(vector org, vector dir) launch_spike =
  1064.  {
  1065. +  if (self.modules_weapon & MODULES_WEAPON_WELD) {    //#jp#(Weld)
  1066. +    WeldFire(org,dir);                                //#jp#(Weld)
  1067. +    return;                              //#jp#(Weld)
  1068. +  }                                  //#jp#(Weld)
  1069. +
  1070.      newmis = spawn ();
  1071.      newmis.owner = self;
  1072.      newmis.movetype = MOVETYPE_FLYMISSILE;
  1073. @@ -630,6 +714,7 @@
  1074.      local entity    old;
  1075.      
  1076.      sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
  1077. +    self.protect_finished = time - 10; //#jp#(Protect)
  1078.      self.attack_finished = time + 0.2;
  1079.      self.currentammo = self.ammo_nails = self.ammo_nails - 2;
  1080.      dir = aim (self, 1000);
  1081. @@ -660,8 +745,13 @@
  1082.          return;
  1083.      }
  1084.  
  1085. +  if (!(self.modules_weapon & MODULES_WEAPON_WELD)) {    //#jp#(Weld)
  1086.      sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
  1087. +  } else {                                               //#jp#(Weld)
  1088. +    ox = ox - 1;                                         //#jp#(Weld)
  1089. +  }                                                     //#jp#(Weld)
  1090.      self.attack_finished = time + 0.2;
  1091. +    self.protect_finished = time - 10; //#jp#(Protect)
  1092.      self.currentammo = self.ammo_nails = self.ammo_nails - 1;
  1093.      dir = aim (self, 1000);
  1094.      launch_spike (self.origin + '0 0 16' + v_right*ox, dir);
  1095. @@ -686,6 +776,8 @@
  1096.          remove(self);
  1097.          return;
  1098.      }
  1099. +
  1100. +   if (other.classname == "drone") return; //#jp#(Drone)
  1101.      
  1102.  // hit something that bleeds
  1103.      if (other.takedamage)
  1104. @@ -731,6 +823,10 @@
  1105.      if (other.takedamage)
  1106.      {
  1107.          spawn_touchblood (18);
  1108. +   if (other.classname == "drone") {        //#jp#(Drone)
  1109. +      T_Damage (other, self, self.owner, 4);    //#jp#(Drone)
  1110. +      return;                    //#jp#(Drone)
  1111. +   }                        //#jp#(Drone)
  1112.          T_Damage (other, self, self.owner, 18);
  1113.      }
  1114.      else
  1115. @@ -761,6 +857,10 @@
  1116.  
  1117.      self.items = self.items - ( self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS) );
  1118.      
  1119. +    if (self.weapon != IT_GRENADE_LAUNCHER) DroneResetWeapon(self);   //#jp#(Shrapnel)
  1120. +    if (self.weapon != IT_ROCKET_LAUNCHER) ShrapnelResetWeapon(self); //#jp#(Drone)
  1121. +    if (self.weapon != IT_NAILGUN) WeldResetWeapon(self);             //#jp#(Weld)
  1122. +
  1123.      if (self.weapon == IT_AXE)
  1124.      {
  1125.          self.currentammo = 0;
  1126. @@ -852,6 +952,7 @@
  1127.          return TRUE;
  1128.      
  1129.      self.weapon = W_BestWeapon ();
  1130. +   if (self.weapon==IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  1131.  
  1132.      W_SetCurrentAmmo ();
  1133.      
  1134. @@ -935,6 +1036,7 @@
  1135.      {
  1136.          player_light1();
  1137.          self.attack_finished = time + 0.1;
  1138. +        self.lightning_sound_lasttime = -1;//#jp#(Lightning)
  1139.          sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  1140.      }
  1141.  };
  1142. @@ -949,6 +1051,8 @@
  1143.  {
  1144.      local    float    it, am, fl;
  1145.      
  1146. +    if (self.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  1147. +
  1148.      it = self.items;
  1149.      am = 0;
  1150.      
  1151. @@ -971,6 +1075,7 @@
  1152.      else if (self.impulse == 4)
  1153.      {
  1154.          fl = IT_NAILGUN;
  1155. +        if (self.weapon != IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  1156.          if (self.ammo_nails < 1)
  1157.              am = 1;
  1158.      }
  1159. @@ -983,12 +1088,14 @@
  1160.      else if (self.impulse == 6)
  1161.      {
  1162.          fl = IT_GRENADE_LAUNCHER;
  1163. +        DroneToggleWeapon(self);  //#jp#(Drone)
  1164.          if (self.ammo_rockets < 1)
  1165.              am = 1;
  1166.      }
  1167.      else if (self.impulse == 7)
  1168.      {
  1169.          fl = IT_ROCKET_LAUNCHER;
  1170. +        ShrapnelToggleWeapon(self); //#jp#(Shrapnel)
  1171.          if (self.ammo_rockets < 1)
  1172.              am = 1;
  1173.      }
  1174. @@ -1018,6 +1125,9 @@
  1175.  //
  1176.      self.weapon = fl;        
  1177.      W_SetCurrentAmmo ();
  1178. +
  1179. + if (self.weapon == IT_NAILGUN)  WeldToggleWeapon(self);   //#jp#(Weld)
  1180. +
  1181.  };
  1182.  
  1183.  /*
  1184. @@ -1064,6 +1174,8 @@
  1185.      
  1186.      it = self.items;
  1187.      self.impulse = 0;
  1188. +
  1189. +    if (self.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  1190.      
  1191.      while (1)
  1192.      {
  1193. @@ -1119,6 +1231,7 @@
  1194.          if ( (it & self.weapon) && am == 0)
  1195.          {
  1196.              W_SetCurrentAmmo ();
  1197. +  if (self.weapon == IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  1198.              return;
  1199.          }
  1200.      }
  1201. @@ -1139,6 +1252,8 @@
  1202.      it = self.items;
  1203.      self.impulse = 0;
  1204.  
  1205. +    if (self.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  1206. +
  1207.      while (1)
  1208.      {
  1209.          am = 0;
  1210. @@ -1193,6 +1308,7 @@
  1211.          if ( (it & self.weapon) && am == 0)
  1212.          {
  1213.              W_SetCurrentAmmo ();
  1214. +  if (self.weapon == IT_NAILGUN) WeldToggleWeapon(self); //#jp#(Weld)
  1215.              return;
  1216.          }
  1217.      }
  1218. @@ -1229,6 +1345,8 @@
  1219.  */
  1220.  void() ImpulseCommands =
  1221.  {
  1222. +   if (self.impulse) {                        //#jp#(Modules)
  1223. +
  1224.      if (self.impulse >= 1 && self.impulse <= 8)
  1225.          W_ChangeWeapon ();
  1226.  
  1227. @@ -1243,6 +1361,74 @@
  1228.  
  1229.      if (self.impulse == 255)
  1230.          QuadCheat ();
  1231. +
  1232. +        if (self.impulse >= 200) {                //#jp#(Modules)
  1233. +           if (self.impulse == 200) {                //#jp#(Skin)
  1234. +          if (USE_MODULE_SKIN) SkinUseOtherSkin(self,1);    //#jp#(Skin)
  1235. +           }                            //#jp#(Skin)
  1236. +           else if (self.impulse == 201) {            //#jp#(Skin)
  1237. +          if (USE_MODULE_SKIN) SkinUseOtherSkin(self,(-1));    //#jp#(Skin)
  1238. +           }                            //#jp#(Skin)
  1239. +           else if (self.impulse == 202) {            //#jp#(Skin)
  1240. +          if (USE_MODULE_SKIN) SkinHelp(self);        //#jp#(Skin)
  1241. +           }                            //#jp#(Skin)
  1242. +           else if (self.impulse == 203) {            //#jp#(Rank)
  1243. +              if (USE_MODULE_RANK) RankDumpRanksToConsole(self);//#jp#(Rank)
  1244. +           }                            //#jp#(Rank)
  1245. +           else if (self.impulse == 204) {            //#jp#(Rank)
  1246. +              if (USE_MODULE_RANK) RankHelp(self);        //#jp#(Rank)
  1247. +           }                            //#jp#(Rank)
  1248. +           else if (self.impulse == 205) {            //#jp#(Observer)
  1249. +              if (USE_MODULE_OBSERVER) ObserverHelp(self);    //#jp#(Observer)
  1250. +           }                            //#jp#(Observer)
  1251. +           else if (self.impulse == 206) {            //#jp#(Observer)
  1252. +              if (USE_MODULE_OBSERVER) ObserverNoclip(self);    //#jp#(Observer)
  1253. +           }                            //#jp#(Observer)
  1254. +           else if (self.impulse == 207) {            //#jp#(ServerHelp)
  1255. +              if (USE_MODULE_SERVERHELP) ServerHelpShowHelp(self);//#jp#(ServerHelp)
  1256. +           }                            //#jp#(ServerHelp)
  1257. +           else if (self.impulse == 208) {            //#jp#(Init)
  1258. +              if (InitCallIsPermitted(self)) {            //#jp#(Init)
  1259. +                 stuffcmd(self,"init;\n");            //#jp#(Init)
  1260. +              }                            //#jp#(Init)
  1261. +           }                            //#jp#(Init)
  1262. +           else if (self.impulse == 209) {            //#jp#(Init)
  1263. +              if (InitCallIsPermitted(self)) {            //#jp#(Init)
  1264. +             if (USE_MODULE_SKIN) {                //#jp#(Skin)
  1265. +                    SkinQuietlyUseOtherSkin(self,1);        //#jp#(Skin)
  1266. +                 }                        //#jp#(Skin)
  1267. +                 stuffcmd(self,"init;\n");            //#jp#(Init)
  1268. +              }                            //#jp#(Init)
  1269. +           }                            //#jp#(Init)
  1270. +           else if (self.impulse == 210) {            //#jp#(ExitRules)
  1271. +              if (USE_MODULE_EXITRULES) ExitRulesHelp(self);    //#jp#(ExitRules)
  1272. +           }                            //#jp#(ExitRules)
  1273. +           else if (self.impulse == 211) {            //#jp#(VoteExit)
  1274. +              if (USE_MODULE_VOTE) VoteHelp(self);        //#jp#(Vote)
  1275. +           }                            //#jp#(Vote)
  1276. +           else if (self.impulse == 212) {            //#jp#(VoteExit)
  1277. +              if (USE_MODULE_VOTE) VoteShowVotes(self);        //#jp#(Vote)
  1278. +           }                            //#jp#(Vote)
  1279. +           else if (self.impulse == 213) {            //#jp#(Vote)
  1280. +              if (USE_MODULE_VOTE) VoteExitVote(self);        //#jp#(Vote)
  1281. +           }                            //#jp#(Vote)
  1282. +           else if (self.impulse == 214) {            //#jp#(Vote)//#jp#(ExitRules)
  1283. +              if (USE_MODULE_VOTE) VoteExitRulesVote(self);    //#jp#(Vote)//#jp#(ExitRules)
  1284. +           }                            //#jp#(Vote)//#jp#(ExitRules)
  1285. +           else if (self.impulse == 215) {            //#jp#(Vote)//#jp#(ExitRules)
  1286. +              if (USE_MODULE_DRONE) DroneHelp(self);        //#jp#(Drone)
  1287. +           }                            //#jp#(Drone)
  1288. +           else if (self.impulse == 216) {            //#jp#(Shrapnel)
  1289. +              if (USE_MODULE_SHRAPNEL) ShrapnelHelp(self);    //#jp#(Shrapnel)
  1290. +           }                            //#jp#(Shrapnel)
  1291. +           else if (self.impulse == 217) {            //#jp#(Weld)
  1292. +              if (USE_MODULE_WELDGUN) WeldHelp(self);        //#jp#(Weld)
  1293. +           }                            //#jp#(Weld)
  1294. +           else if (self.impulse == 218) {            //#jp#(Modules)
  1295. +              ModulesShowActiveModules(self);            //#jp#(Modules)
  1296. +           }                            //#jp#(Modules)
  1297. +        }                            //#jp#(Modules)
  1298. +   }                                //#jp#(Modules)
  1299.          
  1300.      self.impulse = 0;
  1301.  };
  1302. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/world.qc qc/world.qc
  1303. --- qc-ori/world.qc    Thu Sep 26 11:15:40 1996
  1304. +++ qc/world.qc    Fri Oct  4 00:00:00 1996
  1305. @@ -254,6 +254,10 @@
  1306.      precache_sound ("misc/water1.wav");            // swimming
  1307.      precache_sound ("misc/water2.wav");            // swimming
  1308.  
  1309. +if (USE_MODULE_OBSERVER) {            //#jp#(Observer)
  1310. +    precache_sound ("wizard/wsight.wav");    //#jp#(Observer)
  1311. +}                        //#jp#(Observer)
  1312. +
  1313.      precache_model ("progs/player.mdl");
  1314.      precache_model ("progs/eyes.mdl");
  1315.      precache_model ("progs/h_player.mdl");
  1316. @@ -288,6 +292,16 @@
  1317.  
  1318.      precache_model ("progs/v_light.mdl");
  1319.      
  1320. +    if (USE_MODULE_DRONE) {                 //#jp#(Drone)
  1321. +      precache_model ("progs/v_spike.mdl"); //#jp#(Drone)
  1322. +    }                                       //#jp#(Drone)
  1323. +    if (USE_MODULE_WELDGUN) {               //#jp#(Weld)
  1324. +      precache_model ("progs/flame2.mdl");  //#jp#(Weld)
  1325. +    }                                       //#jp#(Weld)
  1326. +    if (USE_MODULE_SHRAPNEL) {              //#jp#(Shrapnel)
  1327. +      precache_model ("progs/flame2.mdl");  //#jp#(Shrapnel)
  1328. +      precache_model ("progs/tarbaby.mdl"); //#jp#(Shrapnel)
  1329. +    }                                       //#jp#(Shrapnel)
  1330.  
  1331.  //
  1332.  // Setup light animation tables. 'a' is total darkness, 'z' is maxbright.
  1333. @@ -377,6 +391,7 @@
  1334.  // respawned elsewhere
  1335.  void(entity ent) CopyToBodyQue =
  1336.  {
  1337. +    bodyque_head.skin = ent.skin; //#jp#(Skin)
  1338.      bodyque_head.angles = ent.angles;
  1339.      bodyque_head.model = ent.model;
  1340.      bodyque_head.modelindex = ent.modelindex;
  1341.